//
//  SetControlObservableViewController.swift
//  Example
//
//  Created by T AO on 2022/2/10.
//

import UIKit
import RxSwift

class SetControlObservableViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

//        toArray()
//        reduce()
        concat()
    }

}

// MARK: - 集合控制操作符

extension SetControlObservableViewController {
    /// toArray
    /// 先把一个序列转成一个数组，并作为一个单一的事件发送，然后结束
    private func toArray() {
        Observable.range(start: 1, count: 10)
            .toArray()
            .subscribe { print($0) }
            .disposed(by: disposeBag)
    }
    
    /// reduce
    /// 接受一个初始值和一个操作符号
    /// 将给定的初始值，与序列里的每个值进行累计运算。得到一个最终结果，并将其作为单个值发送出去
    /// + - * ÷
    private func reduce() {
        Observable.of(10, 100, 1000)
            .reduce(1, accumulator: +)
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }
    
    /// concat
    /// 把多个 Observable 序列合并（串联）为一个 Observable 序列
    /// 并且只有当前面一个 Observable 序列发出了 completed 事件，才会开始发送下一个 Observable 序列事件
    private func concat() {
        let subject1 = BehaviorSubject(value: "TAO")
        let subject2 = BehaviorSubject(value: "1")
        
        let subject = BehaviorSubject(value: subject1)
        
        subject.asObservable()
            .concat()
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
        
        subject1.onNext("Germ")
        subject1.onNext("xxx") // TAO Germ xxx
        
        subject.onNext(subject2)
        
        subject2.onNext("不打印")
        subject2.onNext("zzz") // zzz 覆盖 不打印
        
        subject1.onCompleted() // 必须要等subject1 完成了才能订阅到! 用来控制顺序，网络数据的异步
        
        subject2.onNext("aaa")
    }
}
